import { baseDataList } from '@/service/baseData'
// 基础数据缓存

const state = {
  // 日志字典
  country_code: [], // 国家
  currency: [], // 币种
  approve_status: [], // 审批状态
  deliver_status: [], // 发货状态
  payment_status: [], // 回款状态
  apply_status: [], // 发货申请状态
  flow_name_type: [], // 回款池列表名目
  claim_status: [], // 认领状态
  reject_reason: [], // 驳回原因
  checking_status: [], // 核账状态
  payment_stage: [], // 回款阶段
  write_status: [], // 核销状态
  account_type: [], // 充值类型
  company_type: [], // 客户类型
  trade_terms: [], // 贸易术语
  forwarder_type: [], // 货代方式
  delivery_warehouse: [], // 发货仓库
  transport_type: [], // 运输方式
  rebate_change_source: [], // 返点变更源
  credit_change_source: [] // 信用变更源
}

const mutations = {
  SET_BASE_DATA: (state, { type, data }) => {
    state[type] = data
  }
}

const actions = {
  getBaseDataList: (() => {
    // 设置字典缓存
    const cache = new Map()
    // 过期时间20分钟
    const timeOut = 1000 * 60 * 20

    // 记录请求key，如果已经存在请求内容，则进行等待，等上一次同样key的请求完成后从cache中获取数据
    // data = {type: 'run_type', isCache: false}
    const requestKeyMap = new Map()
    return ({ commit }, data) => {
      return new Promise((resolve, reject) => {
        const key = data.type
        const { isCache = true } = data
        // 处理过期字典，保证字典新鲜，优先读取缓存数据
        const result = cache.get(key)

        if (result && isCache) {
          // 如果过期时间大于当前时间, 取缓存
          if (result.expired > +new Date()) {
            resolve(result.value)
            return
          } else {
            commit('SET_BASE_DATA', { type: key, data: [] })
            cache.delete(key)
          }
        }

        // 处理未请求完成进行了下一次resolve 将请求内容插入队列, 实现请求一次
        const requestQueue = requestKeyMap.get(key)
        if (requestQueue) {
          requestQueue.resolve.push(resolve)
          requestQueue.reject.push(reject)
          requestKeyMap.set(key, requestQueue)
          return
        } else {
          requestKeyMap.set(key, {
            resolve: [resolve],
            reject: [reject]
          })
        }
        // 请求字典
        baseDataList({ ...data }).then(data => {
          const list = (data || []).map(item => {
            return {
              value: item.rawDataId,
              label: item.name
            }
          })
          // 对字典数据进行缓存
          cache.set(key, { expired: +new Date() + timeOut, value: list })
          // 更新字典状态
          commit('SET_BASE_DATA', { type: key, data: list })
          // 处理请求队列
          const requestQueue = requestKeyMap.get(key)
          requestQueue.resolve.forEach(resolve2 => {
            resolve2(list)
          })

          requestKeyMap.delete(key)
          // resolve已经插入队列， 不用再次resolve
          // resolve(list)
        }).catch(error => {
          // const requestQueue = requestKeyMap.get(key)
          requestKeyMap.delete(key)
          // 字典请求已经出错，无需要重复reject
          // requestQueue.reject.forEach(reject => reject())

          reject(error)
        })
      })
    }
  })()

}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
